<?php
declare(strict_types=1);

namespace app\validate\api\admin\general;

use app\validate\api\ApiBaseValidate;

class PrintTemplateValidate extends ApiBaseValidate
{
    protected $ex_data = [];

    protected $rule = [
        'id' => 'require|integer',
        'title|模板名称' => 'require|max:64',
        'scene|场景' => 'max:64',
        'content|模板内容' => 'max:65535|isContentValide',
        'sort|排序' => 'require|integer|between:0,255',
        'status|状态' => 'require|in:0,1',
        'remark|备注' => 'max:255',

        // 扩展
        'del_ids' => 'require|regex:ids',
    ];

    protected $message = [];

    protected $scene = [
        'save' => ['title', 'scene', 'content', 'sort', 'status', 'remark'],
        'update' => ['id', 'title', 'scene', 'content', 'sort', 'status', 'remark'],
        'delete' => ['del_ids'],
    ];

    protected function isContentValide($value, $rule, $data = [])
    {
        if ($value) {
            // lodop常用并应该安全的函数-防止混入恶意代码
            $_lodop_funs_common = [
                'PRINT_INIT', //打印初始化
                'ADD_PRINT_TEXT', //增加纯文本打印项
                'SET_PRINT_STYLE', //设置打印项风格
                'ADD_PRINT_IMAGE', //增加图片打印项
                'ADD_PRINT_BARCODE', //增加条形码

                'ADD_PRINT_RECT', //增加矩形线
                'ADD_PRINT_ELLIPSE', //增加椭圆线
                'ADD_PRINT_LINE', //增加直线

                'SET_PRINT_PAGESIZE', //设定纸张大小
                'ADD_PRINT_SETUP_BKIMG', //指定背景图
                'SET_SHOW_MODE', //设置显示模式

                'NEWPAGE', //强制分页

                'SET_PRINT_MODE', //设置打印模式
                'SET_PRINT_COPIES', //设置打印份数

                'FORMAT', //数据格式转换

                // 增强函数
                'PRINT_INITA', //(增强型)打印初始化
                'ADD_PRINT_TEXTA', //(增强型)增加纯文本打印项
                'SET_PRINT_STYLEA', //(增强型) 设置打印项风格A,继承SET_PRINT_STYLE的所有属性

                'ADD_PRINT_SHAPE', //(增强型)增加图形
                'SET_PRINTER_INDEXA', //(增强型)指定打印设备
                'NEWPAGEA', //(增强型)强制分页

                'DO_ACTION', //控制界面动作
                'SET_LICENSES', //设置软件产品注册信息
            ];

            $value = str_replace("\r\n", "\n", $value);
            $lines = explode("\n", $value);

            $t_regx = implode('|', $_lodop_funs_common);
            foreach ($lines as $key => $line) {
                if ($line) {
                    //  每行语法合法化 验证--因为这里依赖第三方lodop,避免太信任其安全性,而被攻击 如混入html中恶意js代码
                    // ^LODOP\.(?:PRINT_INITA|ADD_PRINT_TEXT|PRINT_INIT)\(.*\);$       // LODOP.*(*);\r\n
                    if (1 != preg_match('/^' . "LODOP\.(?:" . $t_regx . ")\(.*\);" . '$/', (string) $line)) {
                        return '第' . ($key + 1) . '行,非法lodop语法:' . $line;
                    }
                }
            }
        }
        return true;
    }
}
